Fix non-deterministic unit dependency list generation
authorAndrew Watts <a@andwur.com>
Fri, 21 Apr 2017 01:24:47 +0000 (10:54 +0930)
committerAlex Crichton <alex@alexcrichton.com>
Tue, 16 May 2017 15:07:07 +0000 (08:07 -0700)
This resulted in the flags passed to rustc having random
ordering, see #3895.

src/cargo/core/resolver/mod.rs
src/cargo/ops/cargo_rustc/context.rs

index 896b280469e6fea9c04dd02ef1cb518d4ae779bc..1a3e217bf58206a640ca21bbd9f87ae17ed15949 100644 (file)
@@ -200,6 +200,12 @@ unable to verify that `{0}` is the same as when the lockfile was generated
         Deps { edges: self.graph.edges(pkg), resolve: self }
     }
 
+    pub fn deps_sorted(&self, pkg: &PackageId) -> Vec<&PackageId> {
+        let mut deps = self.deps(pkg).collect::<Vec<_>>();
+        deps.sort();
+        deps
+    }
+
     pub fn deps_not_replaced(&self, pkg: &PackageId) -> DepsNotReplaced {
         DepsNotReplaced { edges: self.graph.edges(pkg) }
     }
index e17a0823b6c0e220098bab5b6eecccfa48970dd9..49565ad9fe28f9eea6d3437a67776dea3123dc35 100644 (file)
@@ -614,8 +614,8 @@ impl<'a, 'cfg> Context<'a, 'cfg> {
         }
 
         let id = unit.pkg.package_id();
-        let deps = self.resolve.deps(id);
-        let mut ret = deps.filter(|dep| {
+        let deps = self.resolve.deps_sorted(id);
+        let mut ret = deps.iter().filter(|dep| {
             unit.pkg.dependencies().iter().filter(|d| {
                 d.name() == dep.name() && d.version_req().matches(dep.version())
             }).any(|d| {
@@ -748,7 +748,8 @@ impl<'a, 'cfg> Context<'a, 'cfg> {
 
     /// Returns the dependencies necessary to document a package
     fn doc_deps(&self, unit: &Unit<'a>) -> CargoResult<Vec<Unit<'a>>> {
-        let deps = self.resolve.deps(unit.pkg.package_id()).filter(|dep| {
+        let deps = self.resolve.deps_sorted(unit.pkg.package_id());
+        let deps = deps.iter().filter(|dep| {
             unit.pkg.dependencies().iter().filter(|d| {
                 d.name() == dep.name()
             }).any(|dep| {